/*******************************************************************************
* 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;
import java.awt.BorderLayout;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import org.dcm4che3.data.Tag;
import org.weasis.acquire.explorer.AcquireImageInfo;
import org.weasis.acquire.explorer.AcquireManager;
import org.weasis.acquire.explorer.core.bean.SeriesGroup;
import org.weasis.acquire.explorer.gui.control.AcquirePublishPanel;
import org.weasis.dicom.codec.TagD;
@SuppressWarnings("serial")
public class AcquireTabPanel extends JPanel {
private final Map<SeriesGroup, List<AcquireImageInfo>> btnMap = new HashMap<>();
private final SerieButtonList serieList;
private final ButtonGroup btnGrp;
private final AcquireCentralImagePanel imageList;
private SerieButton selected;
public AcquireTabPanel() {
setLayout(new BorderLayout());
btnGrp = new ButtonGroup();
serieList = new SerieButtonList();
imageList = new AcquireCentralImagePanel(this);
JPanel seriesPanel = new JPanel(new BorderLayout());
seriesPanel.add(serieList, BorderLayout.CENTER);
seriesPanel.add(new AcquirePublishPanel(), BorderLayout.SOUTH);
add(seriesPanel, BorderLayout.WEST);
add(imageList, BorderLayout.CENTER);
}
public void setSelected(SerieButton btn) {
selected = btn;
SeriesGroup seriesGroup = getSeriesGroup();
imageList.setSeriesGroup(seriesGroup, seriesGroup == null ? null : btnMap.get(seriesGroup));
imageList.refreshGUI();
}
public void updateSerie(SeriesGroup seriesGroup, List<AcquireImageInfo> imageInfos) {
if (imageInfos == null) {
return;
}
if (btnMap.containsKey(seriesGroup)) {
// update series list
btnMap.put(seriesGroup, imageInfos);
if (seriesGroup.equals(getSeriesGroup())) {
setSelected(selected);
}
} else {
// Create series list
btnMap.put(seriesGroup, imageInfos);
SerieButton btn = new SerieButton(seriesGroup, this);
btnGrp.add(btn);
serieList.addButton(btn);
if (selected == null) {
btnGrp.setSelected(btn.getModel(), true);
setSelected(btn);
}
}
}
public void addSeriesElement(SeriesGroup seriesGroup, List<AcquireImageInfo> imageInfos) {
if (imageInfos == null) {
return;
}
if (btnMap.containsKey(seriesGroup)) {
btnMap.get(seriesGroup).addAll(imageInfos);
if (seriesGroup.equals(getSeriesGroup())) {
setSelected(selected);
}
} else {
// Create series list
btnMap.put(seriesGroup, imageInfos);
SerieButton btn = new SerieButton(seriesGroup, this);
btnGrp.add(btn);
serieList.addButton(btn);
if (selected == null) {
btnGrp.setSelected(btn.getModel(), true);
setSelected(btn);
}
}
}
public Set<SeriesGroup> getSeries() {
return new TreeSet<>(btnMap.keySet());
}
private SeriesGroup getSeriesGroup() {
return selected == null ? null : selected.getSerie();
}
private void removeSerie(SeriesGroup seriesGroup) {
btnMap.remove(seriesGroup);
serieList.getButton(seriesGroup).ifPresent(btnGrp::remove);
serieList.removeBySerie(seriesGroup);
Optional<SerieButton> nextBtn = serieList.getFirstSerieButton();
if (nextBtn.isPresent()) {
btnGrp.setSelected(nextBtn.get().getModel(), true);
setSelected(nextBtn.get());
} else if (btnMap.isEmpty()) {
setSelected(null);
}
}
public SerieButton getSelected() {
return selected;
}
public void removeImage(AcquireImageInfo imageInfo) {
btnMap.entrySet().stream().filter(e -> e.getValue().contains(imageInfo)).findFirst()
.ifPresent(e -> removeImage(e.getKey(), imageInfo));
}
public void removeImages(Collection<AcquireImageInfo> images) {
Map<SeriesGroup, List<AcquireImageInfo>> imagesToRemove = new HashMap<>();
for (Entry<SeriesGroup, List<AcquireImageInfo>> e : btnMap.entrySet()) {
List<AcquireImageInfo> newList = null;
Iterator<AcquireImageInfo> it = images.iterator();
while (it.hasNext()) {
AcquireImageInfo image = it.next();
if (e.getValue().contains(image)) {
it.remove();
if (newList == null) {
newList = new ArrayList<>();
}
newList.add(image);
}
}
if (newList != null) {
imagesToRemove.put(e.getKey(), newList);
}
}
imagesToRemove.forEach(this::removeImages);
}
private void removeImage(SeriesGroup seriesGroup, AcquireImageInfo imageInfo) {
List<AcquireImageInfo> imageInfos = btnMap.get(seriesGroup);
if (Objects.nonNull(imageInfos)) {
imageInfos.remove(imageInfo);
if (imageInfos.isEmpty()) {
removeSerie(seriesGroup);
serieList.refreshGUI();
} else if (seriesGroup.equals(getSeriesGroup())) {
setSelected(selected);
}
}
}
private void removeImages(SeriesGroup seriesGroup, List<AcquireImageInfo> images) {
List<AcquireImageInfo> imagePane = btnMap.get(seriesGroup);
if (Objects.nonNull(imagePane)) {
imagePane.removeAll(images);
if (seriesGroup.equals(getSeriesGroup())) {
setSelected(selected);
}
if (imagePane.isEmpty()) {
removeSerie(seriesGroup);
serieList.refreshGUI();
} else if (seriesGroup.equals(getSeriesGroup())) {
setSelected(selected);
}
}
}
public void clearUnusedSeries(List<SeriesGroup> usedSeries) {
List<SeriesGroup> seriesToRemove =
btnMap.keySet().stream().filter(s -> !usedSeries.contains(s)).collect(Collectors.toList());
seriesToRemove.stream().forEach(this::removeSerie);
serieList.refreshGUI();
}
public void clearAll() {
for (SeriesGroup seriesGroup : btnMap.keySet()) {
serieList.getButton(seriesGroup).ifPresent(btnGrp::remove);
serieList.removeBySerie(seriesGroup);
}
btnMap.clear();
setSelected(null);
refreshGUI();
}
public void refreshGUI() {
imageList.refreshGUI();
serieList.refreshGUI();
}
public void refreshInfoGUI() {
imageList.refreshInfoGUI();
}
public void moveElements(SeriesGroup seriesGroup, List<AcquireImageInfo> medias) {
removeImages(selected.getSerie(), medias);
medias.forEach(m -> m.setSeries(seriesGroup));
updateSerie(seriesGroup, AcquireManager.findbySeries(seriesGroup));
}
public void moveElementsByDate(List<AcquireImageInfo> medias) {
removeImages(selected.getSerie(), medias);
Set<SeriesGroup> seriesGroups = new HashSet<>();
medias.forEach(m -> {
LocalDateTime date = TagD.dateTime(Tag.ContentDate, Tag.ContentTime, m.getImage());
SeriesGroup seriesGroup = AcquireManager.getSeries(new SeriesGroup(date));
seriesGroups.add(seriesGroup);
m.setSeries(seriesGroup);
});
AcquireManager.groupBySeries().forEach((k, v) -> {
if (seriesGroups.contains(k)) {
updateSerie(k, v);
}
});
}
}