package org.rr.jeborker.gui.model; import static org.apache.commons.lang.ObjectUtils.notEqual; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; import org.rr.commons.utils.DateConversionUtils; import org.rr.commons.utils.DateUtils; import org.rr.commons.utils.ReflectionUtils; import org.rr.commons.utils.StringUtil; import org.rr.jeborker.db.item.EbookPropertyItem; import org.rr.jeborker.gui.MainController; import org.rr.jeborker.metadata.MetadataProperty; import com.l2fprod.common.propertysheet.DefaultProperty; class EbookSheetProperty extends DefaultProperty { private static final long serialVersionUID = 1L; private final List<EbookPropertyItem> items; protected MetadataProperty metadataProperty; protected int propertyIndex; /** * Flags that tells that the value for this property has changed */ private boolean changed = false; public EbookSheetProperty(final MetadataProperty metadataProperty, final List<EbookPropertyItem> items, final int propertyIndex) { this.metadataProperty = metadataProperty; this.propertyIndex = propertyIndex; this.items = items; this.setEditable(metadataProperty.isEditable()); this.setDeletable(metadataProperty.isDeletable()); } /** * Get the {@link EbookPropertyItem} for this property. * @return The desired {@link EbookPropertyItem}. */ public List<EbookPropertyItem> getEbookPropertyItems() { return this.items; } void firePropertyChanged(Object oldValue, Object newValue) { firePropertyChange(oldValue, newValue); } /** * Tells if the property value has changed. * @return <code>true</code> if the property value has changed and <code>false</code> otherwise. */ public boolean isChanged() { return changed; } void setChanged(boolean changed) { this.changed = changed; } @Override public void setValue(Object value) { Object editorValue = getValue(); if(value instanceof Date && editorValue instanceof Date) { if(!DateUtils.equals((Date) value, (Date) editorValue)) { metadataProperty.setValue(value, this.propertyIndex); this.setChanged(true); } else { this.setChanged(false); return; } } else if (notEqual(value, editorValue)) { metadataProperty.setValue(value, this.propertyIndex); this.setChanged(true); } else if(value == null) { metadataProperty.setValue(value, this.propertyIndex); this.setChanged(true); } else { this.setChanged(false); return; } super.setValue(value); } @Override public String getName() { String name = metadataProperty.getName(); return name; } @Override public String getShortDescription() { final StringBuilder value = new StringBuilder(); final boolean isDate = ReflectionUtils.equals(metadataProperty.getPropertyClass(), Date.class); final int lpropertyIndex = this.propertyIndex >= 0 ? this.propertyIndex : 0; if (isDate) { if (value.length() > 0) { value.append("<br/>"); } Object propertyValue = metadataProperty.getValues().get(lpropertyIndex); if (propertyValue instanceof Date) { value.append(DateFormat.getDateInstance(SimpleDateFormat.LONG).format((Date) propertyValue)); } else { Date date = DateConversionUtils.toDate(StringUtil.toString(metadataProperty.getValues().get(lpropertyIndex))); if (date != null) { value.append(DateFormat.getDateInstance(SimpleDateFormat.LONG).format(date)); } } } else { if (value.length() > 0) { value.append("<br/>"); } value.append(StringUtil.toString(metadataProperty.getValues().get(lpropertyIndex))); } if(StringUtil.isNotBlank(metadataProperty.getAdditionalDescription())) { value.append("<br/>" + metadataProperty.getAdditionalDescription()); } return value.toString(); } @Override public String getDisplayName() { final String name = metadataProperty.getName(); String localizedName = MainController.getController().getLocalizedString(name); if(!isMultiSelection() && metadataProperty.getValues().size() > 1) { localizedName = (this.propertyIndex + 1) + ") " + StringUtil.toString(localizedName); } return StringUtil.toString(localizedName); } public String getDisplayDescriptionName() { String name = (metadataProperty.getOriginCodeName() + " " + metadataProperty.getName()).trim(); String localizedName = getDisplayName(); localizedName += "</b><i> <" + name+"></i><b>"; return localizedName; } @Override public Object getValue() { if(propertyIndex >= 0) { List<String> validValues = metadataProperty.getValidValues(); if(!validValues.isEmpty()) { ArrayList<Object> values = new ArrayList<>(); values.add(metadataProperty.getValues().get(propertyIndex)); values.addAll(validValues); return values; } return metadataProperty.getValues().get(propertyIndex); } else { final List<Object> values = metadataProperty.getValues(); return values; } } @Override public Class<?> getType() { return metadataProperty.getPropertyClass(); } /** * Gets the encapsulated {@link MetadataProperty} which holds the current value state. * @return The encapsulated {@link MetadataProperty} or <code>null</code> if no one existing. */ public List<MetadataProperty> getMetadataProperties() { return Arrays.asList(this.metadataProperty); } /** * Tells if there is currently more than one entry selected. * @return <code>true</code> if more than one value is selected and <code>false</code> otherwise. */ private boolean isMultiSelection() { return MainController.getController().getSelectedEbookPropertyItemRows().length > 1; } @Override public Class<?> getPropertyEditorClass() { return this.metadataProperty.getPropertyEditorClass(); } @Override public Class<?> getPropertyRendererClass() { return this.metadataProperty.getPropertyRendererClass(); } }