/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.acquire.explorer.gui.central.meta.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import javax.swing.table.AbstractTableModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.acquire.explorer.AcquireManager;
import org.weasis.acquire.explorer.Messages;
import org.weasis.acquire.explorer.gui.central.meta.model.imp.AcquireGlobalMeta;
import org.weasis.core.api.media.data.TagReadable;
import org.weasis.core.api.media.data.TagW;
import org.weasis.core.api.media.data.Tagable;
import org.weasis.core.api.service.BundleTools;
import org.weasis.dicom.codec.TagD;
import org.weasis.dicom.util.StringUtil;
public abstract class AcquireMetadataTableModel extends AbstractTableModel {
private static final Logger LOGGER = LoggerFactory.getLogger(AcquireGlobalMeta.class);
private static final long serialVersionUID = -2336248192936430413L;
protected String[] headers =
{ Messages.getString("AcquireMetadataTableModel.tag"), Messages.getString("AcquireMetadataTableModel.val") }; //$NON-NLS-1$ //$NON-NLS-2$
protected Optional<Tagable> tagable;
private final TagW[] tagsToDisplay;
private final TagW[] tagsEditable;
private final TagW[] tagsToPublish;
public AcquireMetadataTableModel(Tagable tagable, TagW[] tagsToDisplay, TagW[] tagsEditable, TagW[] tagsToPublish) {
this.tagable = Optional.ofNullable(tagable);
this.tagsToPublish = tagsToPublish == null ? new TagW[0] : tagsToPublish;
List<TagW> addTags = new ArrayList<>();
for (TagW tag : tagsToPublish) {
if (tagable == null || tagable.getTagValue(tag) == null) {
if (tagsToDisplay == null
|| !Arrays.stream(tagsToDisplay).filter(t -> t.equals(tag)).findFirst().isPresent()) {
addTags.add(tag);
}
}
}
this.tagsToDisplay = getMoreTags(tagsToDisplay, addTags);
this.tagsEditable = getMoreTags(tagsEditable, addTags);
}
private static TagW[] getMoreTags(TagW[] tags, List<TagW> addTags) {
if (addTags.isEmpty()) {
return tags == null ? new TagW[0] : tags;
}
for (TagW tag : tags) {
addTags.add(tag);
}
return addTags.toArray(new TagW[addTags.size()]);
}
public static boolean hasNonNullValues(TagW[] tags, TagReadable tagMaps) {
if (tags != null) {
for (TagW t : tags) {
Object val = tagMaps.getTagValue(t);
if (val == null) {
return false;
}
if (val instanceof String && !StringUtil.hasText((String) val)) {
return false;
}
}
}
return true;
}
protected TagW[] tagsToDisplay() {
return tagsToDisplay;
}
protected TagW[] tagsEditable() {
return AcquireManager.GLOBAL.isAllowFullEdition() ? tagsToDisplay() : tagsEditable;
}
protected TagW[] tagsToPublish() {
return tagsToPublish;
}
@Override
public int getRowCount() {
return tagsToDisplay().length;
}
@Override
public int getColumnCount() {
return headers.length;
}
@Override
public String getColumnName(int column) {
return headers[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
TagW tag = tagsToDisplay()[rowIndex];
switch (columnIndex) {
case 0:
return tag;
case 1:
if (tagable.isPresent()) {
return tagable.get().getTagValue(tag);
} else {
return null;
}
}
return null;
}
public boolean isValueRequired(int rowIndex) {
TagW tag = tagsToDisplay()[rowIndex];
return Arrays.stream(tagsToPublish()).filter(t -> t.equals(tag)).findFirst().isPresent();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
TagW tag = tagsToDisplay()[rowIndex];
if (columnIndex == 1) {
return Arrays.stream(tagsEditable()).filter(t -> t.equals(tag)).findFirst().isPresent();
}
return false;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 1) {
TagW tag = tagsToDisplay()[rowIndex];
tagable.ifPresent(t -> {
t.setTag(tag, aValue);
fireTableCellUpdated(rowIndex, columnIndex);
});
}
}
public static TagW[] getTags(String property, String defaultValues) {
String values = BundleTools.SYSTEM_PREFERENCES.getProperty(property, defaultValues);
if (values == null) {
return new TagW[0];
}
String[] val = values.split(","); //$NON-NLS-1$
List<TagW> list = new ArrayList<>(val.length);
for (String s : val) {
TagW tag = TagD.get(s.trim());
if (tag != null) {
list.add(tag);
} else if (StringUtil.hasText(s)) {
LOGGER.warn("Cannot find the tag named {}", s.trim()); //$NON-NLS-1$
}
}
return list.toArray(new TagW[list.size()]);
}
}